package com.doubao.wechat.service;

import com.doubao.common.result.Result;
import com.doubao.wechat.config.WxPayConfig;
import com.doubao.wechat.dto.request.WxPayOrderRequest;
import com.doubao.wechat.dto.response.WxPayOrderResponse;

import java.util.Map;

/**
 * 微信支付服务接口
 */
public interface WxPayService {

    /**
     * JSAPI/小程序下单
     *
     * @param request 支付订单请求
     * @return 支付订单响应
     */
    Result<WxPayOrderResponse> createOrder(WxPayOrderRequest request);

    /**
     * 查询订单
     *
     * @param outTradeNo 商户订单号
     * @return 订单信息
     */
    Result<Map<String, Object>> queryOrder(String outTradeNo);

//    /**
//     * 关闭订单
//     *
//     * @param outTradeNo 商户订单号
//     * @return 关闭结果
//     */
//    Result<Void> closeOrder(String outTradeNo);

    /**
     * 关闭微信支付订单
     *
     * @param outTradeNo 商户订单号
     * @return 关闭结果
     */
    Result<Boolean> closeOrder(String outTradeNo);

    /**
     * 申请退款
     *
     * @param outTradeNo 商户订单号
     * @param outRefundNo 商户退款单号
     * @param amount 退款金额（单位：分）
     * @param reason 退款原因
     * @return 退款结果
     */
    Result<Map<String, Object>> refund(String outTradeNo, String outRefundNo, Integer amount, String reason);

    /**
     * 处理支付结果通知
     *
     * @param notifyData 通知数据
     * @return 处理结果
     */
    Result<Map<String, Object>> parsePayNotify(String notifyData);

    /**
     * 创建支付订单
     *
     * @param userId     用户ID
     * @param productId  商品ID
     * @param amount     支付金额（单位：分）
     * @param subject    商品标题
     * @param body       商品描述
     * @param payChannel 支付渠道
     * @param payType    支付类型
     * @param attach     附加数据
     * @param clientIp   客户端IP
     * @return 支付订单信息
     */
    Result<Map<String, Object>> createPaymentOrder(Long userId, Long productId, Integer amount,
                                                  String subject, String body, String payChannel,
                                                  String payType, String attach, String clientIp);
    
    /**
     * 获取微信支付配置
     * 
     * @return 微信支付配置对象
     */
    WxPayConfig getWxPayConfig();

}
